public class SwapNodesInPairs {
    public ListNode swapPairs(ListNode head) {
        if(head == null || head.next == null) {
            // 边界判断, 如果链表没有或只有一个元素,不需要交换直接返回
            return head;
        }
        ListNode virtualNode = new ListNode();
        ListNode prev = virtualNode;
        ListNode cur = head;
        ListNode next = cur.next;
        ListNode nnext = next.next;

        while(cur != null && next != null) {
            // cur和next不为空, 说明当前的节点是可以进行交换的
            // 交换节点
            prev.next = next;
            next.next = cur;
            cur.next = nnext;

            // 移动指针
            prev = cur; //上面交换成功后, cur肯定是不为空的
            cur = nnext; // 如果链表中只有两个元素, nnext 是会为 null 的, 因此下面需要进行判断
            if(cur != null) {
                next = cur.next; //奇数情况下, cur不为空, 但cur.next是可能为空的, 因此下面也需要进行判断
            }
            if(next != null) {
                nnext = next.next;
            }
        }

        return virtualNode.next;
    }
}
